[id].js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import React, { Component } from 'react';
  2. import BasePage from "@/components/Layout/BasePage";
  3. import { addDaftarHadirPeserta, getOneLaporanPublic, signature } from '../../../actions/public';
  4. import { getAutoSave } from "@/actions/autosave";
  5. import ContentWrapper from "@/components/Layout/ContentWrapper";
  6. import { Row, Col, Card, CardBody, Button, Modal, ModalBody, ModalFooter, FormGroup, Input, Navbar, NavItem, NavLink, NavbarBrand } from "reactstrap";
  7. import { Formik, Form, Field, ErrorMessage } from "formik";
  8. import * as Yup from "yup";
  9. import SignatureCanvas from 'react-signature-canvas'
  10. import { addPesertaPleno } from '../../../actions/public';
  11. import { toast } from "react-toastify";
  12. import Router from "next/router";
  13. import swal from "sweetalert2";
  14. import Link from 'next/dist/client/link';
  15. import moment from 'moment';
  16. class PlenoSanksi extends Component {
  17. constructor(props) {
  18. super(props);
  19. this.state = {
  20. dataLaporan: {},
  21. modal: false,
  22. signature: "",
  23. nama: "",
  24. data: {},
  25. changesign: false,
  26. pageDone: false,
  27. }
  28. }
  29. static getInitialProps = async ({ query }) => {
  30. return { query };
  31. };
  32. componentDidMount = async () => {
  33. const { query } = this.props;
  34. const { id } = query;
  35. const dataLaporan = await getOneLaporanPublic(id);
  36. this.setState({ dataLaporan });
  37. };
  38. toggleModal = (value = true) => {
  39. if (!value) {
  40. this.setState({ modal: false });
  41. } else {
  42. this.setState({ modal: !this.state.modal });
  43. }
  44. };
  45. sigPad = []
  46. clear = () => {
  47. this.sigPad.clear()
  48. }
  49. updateValueSignature = () => {
  50. const addsig = this.sigPad.getTrimmedCanvas().toDataURL('image/png')
  51. this.setState({
  52. signature: addsig,
  53. changesign: true
  54. })
  55. }
  56. updateValueNama = (e) => {
  57. this.setState({ nama: e.target.value });
  58. }
  59. onSubmit = async (e) => {
  60. const { query, token } = this.props;
  61. const { id } = query;
  62. const sign = this.state.signature
  63. const blob = await (await fetch(sign)).blob();
  64. const files = new File([blob], new Date().valueOf() + 'image.png', { type: blob.type })
  65. const formdata = new FormData();
  66. formdata.append("ttd", files);
  67. formdata.append("laporan_id", id);
  68. formdata.append("nama", this.state.nama);
  69. const added = await addDaftarHadirPeserta(token, formdata);
  70. const toastid = toast.loading("Please wait...");
  71. if (!added) {
  72. swal.fire({
  73. title: "Gagal Input Tanda Tangan",
  74. icon: "error",
  75. confirmButtonColor: "#3e3a8e",
  76. });
  77. } else {
  78. swal.fire({
  79. title: "Berhasil Input Tanda Tangan",
  80. icon: "success",
  81. confirmButtonColor: "#3e3a8e",
  82. });
  83. Router.push(`/signature/modul/done/${id}`);
  84. }
  85. };
  86. render() {
  87. const { signature, nama, changesign } = this.state
  88. return (
  89. <ContentWrapper unwrap>
  90. <Modal isOpen={this.state.modal} >
  91. <ModalBody>
  92. <FormGroup row>
  93. <label className="col-md-2 col-form-label">Nama:<span className=' text-danger'>*</span></label>
  94. <div className="col-md-10">
  95. <Input type="text" value={this.state.nama} onChange={(e) => { this.updateValueNama(e) }} />
  96. </div>
  97. </FormGroup>
  98. <FormGroup row>
  99. <label className="col-md-2 col-form-label">Tanda Tangan:</label>
  100. <div className="col-md-10">
  101. <SignatureCanvas penColor='black' canvasProps={{ className: 'sigCanvas signature-style' }} ref={(ref) => { this.sigPad = ref }} onEnd={(e) => this.setState({ changesign: false })} />
  102. </div>
  103. </FormGroup>
  104. <ModalFooter>
  105. <Button color className="btn-login" onClick={this.updateValueSignature
  106. }>
  107. <span className="font-color-white">Simpan</span>
  108. </Button>
  109. <Button color className="btn-v2" onClick={() => { this.clear(), this.updateValueSignature() }}>
  110. Hapus
  111. </Button>
  112. </ModalFooter>
  113. <ModalFooter>
  114. <Button color className="bg-danger" onClick={this.toggleModal}>
  115. Batal
  116. </Button>
  117. <Button color disabled={signature === "" || signature === "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAtJREFUGFdjYAACAAAFAAGq1chRAAAAAElFTkSuQmCC" || nama === "" || changesign === false} className=" color-3e3a8e" onClick={this.onSubmit}>
  118. <span className="font-color-white ">Kirim</span>
  119. </Button>
  120. </ModalFooter>
  121. </ModalBody>
  122. </Modal>
  123. <div className='page-sign'>
  124. <div className=" ml-5">
  125. <p >
  126. Klik tombol Hadir untuk melakukan tanda tangan sebagai tanda bukti kehadiran rapat
  127. </p>
  128. <Button color="" className="btn-labeled-2" onClick={this.toggleModal}>
  129. <h4 className="mt-2 mb-md-2 text-center font-color-white pl-3 pr-3">Hadir</h4>
  130. </Button>
  131. </div>
  132. </div>
  133. </ContentWrapper>
  134. );
  135. }
  136. }
  137. PlenoSanksi.Layout = BasePage;
  138. export default PlenoSanksi;